package com.blog.cmrpersonalblog.common;

import lombok.Data;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Max;

/**
 * 基础分页请求类
 * 提供统一的分页参数和验证
 */
@Data
public class BasePageRequest {

    /**
     * 页码（从1开始）
     */
    @Min(value = 1, message = "页码不能小于1")
    private Long current = 1L;

    /**
     * 每页大小
     */
    @Min(value = 1, message = "每页大小不能小于1")
    @Max(value = 100, message = "每页大小不能超过100")
    private Long size = 10L;

    /**
     * 排序字段
     */
    private String sortField;

    /**
     * 排序方式 asc/desc
     */
    private String sortOrder = "asc";

    /**
     * 验证排序方式是否有效
     */
    public boolean isValidSortOrder() {
        if (sortOrder == null) {
            return false;
        }
        return sortOrder.equalsIgnoreCase("asc") || sortOrder.equalsIgnoreCase("desc");
    }

    /**
     * 获取安全的排序方式
     */
    public String getSafeSortOrder() {
        return isValidSortOrder() ? sortOrder.toLowerCase() : "asc";
    }

    /**
     * 验证分页参数是否有效
     */
    public boolean isValidPageParams() {
        return current != null && current >= 1 && 
               size != null && size >= 1 && size <= 100;
    }

    /**
     * 获取安全的页码
     */
    public Long getSafeCurrent() {
        return (current != null && current >= 1) ? current : 1L;
    }

    /**
     * 获取安全的每页大小
     */
    public Long getSafeSize() {
        if (size == null || size < 1) {
            return 10L;
        }
        return size > 100 ? 100L : size;
    }

    /**
     * 计算偏移量（用于LIMIT查询）
     */
    public Long getOffset() {
        return (getSafeCurrent() - 1) * getSafeSize();
    }

    /**
     * 设置默认排序（子类可重写）
     */
    public void setDefaultSort(String defaultSortField, String defaultSortOrder) {
        if (this.sortField == null || this.sortField.trim().isEmpty()) {
            this.sortField = defaultSortField;
        }
        if (this.sortOrder == null || this.sortOrder.trim().isEmpty()) {
            this.sortOrder = defaultSortOrder;
        }
    }
}
